47. 全排列 II
47. 全排列 II
Similar Question
Solution Tips
方案一: 回溯 + N 叉树 + 跳过重复
var permuteUnique = function (nums) {
const res = [];
// 因为是全排列, 所以顺序无所谓, 可以排序之后处理跳过重复
// 如果不排序的话, 也可以参考 491 去重? 因为总会有 pop 然后 push 重复的那一刻, skip 即可跳过重复
// 好像 N 叉树的思路, 是不能用 trick skip 的? 那还是乖乖记录单层的 used 吧
nums.sort((a, b) => a - b)
dfs([], nums);
return res;
function dfs(chosen, rest, curIndex) {
if (chosen.length === nums.length) {
res.push([...chosen])
return;
}
// index 每次都是从 0 开始, 所以二元思路好像不太好处理?
for (let i = 0; i < rest.length; i++) {
chosen.push(rest[i])
const newRest = rest.slice(0, i).concat(rest.slice(i + 1));
dfs(chosen, newRest);
chosen.pop();
while(rest[i] === rest[i+1]) i++
}
}
}
console.log(permuteUnique([1,2,3,3]))
方案二: 回溯 + 二元思路
没做出来...
怎么才能运用上 491 的去重思路呢?